////////////////////////////////////////////////////////////////////////////////

#ifndef _CLIENTNETWORK_H_
#define _CLIENTNETWORK_H_

////////////////////////////////////////////////////////////////////////////////

#ifndef _OBSERVER_H_
#include "observer.h"
#endif

#ifndef _CONNECTION_H_
#include "connection.h"
#endif

////////////////////////////////////////////////////////////////////////////////

class Client;
class ClientInfoPacket;
class ClientInputPacket;

////////////////////////////////////////////////////////////////////////////////



/** Game client network manager
*
*  @author   Roman Pasechnik
*  @since    Jun 11th, 2009
*  @updated  Nov 11th, 2009
*/
class ClientNetwork : public Observer
{
////////////////////////////////////////////////////////////////////////////////

public:

////////////////////////////////////////////////////////////////////////////////


    /** Constructor */
    ClientNetwork();


    /** Destructor */
    ~ClientNetwork();


////////////////////////////////////////////////////////////////////////////////


    /* Start client network */
    void Start( Client* _client );


////////////////////////////////////////////////////////////////////////////////


    /* Send client info packet */
    void SendClientInfo( const ClientInfoPacket& _clientInfoPacket );


    /* Send client input packet */
    void SendClientInput( const ClientInputPacket& _clientInputPacket );


    /** Is client connected to server */
    bool IsConnected() const;


////////////////////////////////////////////////////////////////////////////////

private:

////////////////////////////////////////////////////////////////////////////////
//// Observer interface implementation
////////////////////////////////////////////////////////////////////////////////


    /** Notify observer about event */
    virtual void OnEvent( Event _event, Observable* _observable );


////////////////////////////////////////////////////////////////////////////////


    /** Try to connect to the server */
    void Connect();


    /** Receive handler */
    void HandleReceive();


////////////////////////////////////////////////////////////////////////////////


    /** Connection with server */
    Connection m_Connection;


    /** Client interface */
    Client* m_Client;


////////////////////////////////////////////////////////////////////////////////
};


////////////////////////////////////////////////////////////////////////////////

#endif

////////////////////////////////////////////////////////////////////////////////

